import axios from 'axios'
import {baseUrl} from '@/config/config'

/**
 * @param method {string} 方法名
 * @param url {string} 请求地址  例如：/login 配合baseURL组成完整请求地址
 * @param baseURL {string} 请求地址统一前缀 ***需要提前指定***  例如：http://cangdu.org
 * @param timeout {number} 请求超时时间 默认 30000
 * @param params {object}  get方式传参key值
 * @param headers {string} 指定请求头信息
 * @param withCredentials {boolean} 请求是否携带本地cookies信息默认开启
 * @param validateStatus {func} 默认判断请求成功的范围 200 - 300
 * @return {Promise}
 * 其他更多拓展参看axios文档后 自行拓展
 */

export default class Server {
  constructor() {
    this.axiosIns = axios;

    //响应拦截
    this.axiosIns.interceptors.response.use(response => {
      let status = response.status;
      // 请求成功
      if (status === 200) {
        return Promise.resolve(response.data);
      } else {
        // 请求失败
        return Promise.reject(response.data);
      }

    }, error => {
      // console.log('响应出错,测试下面的return promise.reject1');
      console.log(error)
      if (error.message.indexOf('timeout') !== -1) {
        return {msg: '请求超时，请重试'}
      }
      if (error.message.indexOf('404') !== -1) {
        return {msg: '请求资源未找到，请稍后再试'}
      }
      return Promise.reject(error);
    });

  }

  // 默认配置
  defaultOpt = {
    baseUrl: baseUrl,
    timeout: 30000,
    withCredentials: true,  //是否携带cookie发起请求
  }

  post({url = '', data = {}, headers = {}}) {
    return new Promise((resolve, reject) => {
      let _opt = {
        method: 'post',
        url,
        data,
        headers,
        ...this.defaultOpt
      }

      this.axiosIns(_opt).then(res => {
        resolve(res)
      }).catch(e => {
        if (e.response) {
          reject(e.response.data)
        } else {
          reject(e)
        }
      })

    })
  }

  get({url = '', params = {}, headers = {}}) {
    return new Promise((resolve, reject) => {
      let _opt = {
        ...this.defaultOpt,
        method: 'get',
        url,
        params,
        headers
      }
      this.axiosIns(_opt).then(res => {
        resolve(res)
      }).catch(e => {
        if (e.response) {
          reject(e.response.data)
        } else {
          reject(e)
        }
      })

    })
  }
}
